import Joi from 'joi';
import ms from 'ms';

const expiresInSchema = Joi.string()
  .custom((value, helpers) => {
    if (!value) {
      return helpers.error('string.expiresIn');
    }
    const msValue = ms(value);
    if (msValue === undefined) {
      return helpers.error('string.expiresIn');
    }
    if (typeof msValue === 'number' && msValue <= 0) {
      return helpers.error('string.expiresIn.min');
    }
    return value;
  }, 'JWT expiresIn format')
  .messages({
    'string.expiresIn':
      '"JWT_EXPIRES_IN" 请输入合法的 JWT 有效期：https://github.com/vercel/ms',
    'string.expiresIn.min': '"JWT_EXPIRES_IN" JWT 有效期必须大于 0',
  });

export const envValidation = Joi.object({
  NODE_ENV: Joi.string().valid('dev', 'prod', 'test').default('dev'),
  PORT: Joi.number().default(3000),
  JWT_SECRET: Joi.string().default('secret'),
  JWT_EXPIRES_IN: expiresInSchema.default('1h'),
  DB_HOST: Joi.string().default('localhost'),
  DB_PORT: Joi.number().default(3306),
  DB_USER: Joi.string().default('root'),
  DB_PWD: Joi.string().default('root'),
  DB_NAME: Joi.string().default('nest_api'),
  REDIS_HOST: Joi.string().default('localhost'),
  REDIS_PORT: Joi.number().default(6379),
  REDIS_PASSWORD: Joi.string().default(''),
  REDIS_DB: Joi.number().default(0),
  REDIS_PREFIX: Joi.string().default(''),
  REDIS_TTL: Joi.number().default(0),
});
